/*
 标题：李白打酒

    话说大诗人李白，一生好饮。幸好他从不开车。

    一天，他提着酒壶，从家里出来，酒壶中有酒2斗。他边走边唱：

    无事街上走，提壶去打酒。
    逢店加一倍，遇花喝一斗。

    这一路上，他一共遇到店5次，遇到花10次，已知最后一次遇到的是花，他正好把酒喝光了。 

    请你计算李白遇到店和花的次序，可以把遇店记为a，遇花记为b。则：babaabbabbabbbb 就是合理的次序。
    像这样的答案一共有多少呢？请你计算出所有可能方案的个数（包含题目给出的）。

    注意：通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。


 */
package com.yuan.algorithms.competition;

public class 第五届南桥杯_李白打酒 {

	public static void main(String[] args) {
		f(2, 5, 10, 0);
		System.out.println(sum);
	}

	static int drink = 2;//酒的初始值
	static int sum = 0;//解的个数
	static int[] n = new int[15];//记录买酒还是喝酒
	/**
	 * 
	 * @param drink 酒的数量
	 * @param add 买酒的次数
	 * @param sub 喝酒的次数
	 * @param current 当前位置
	 */
	private static void f(int drink, int add, int sub, int current) {
		//酒刚好喝完且买酒喝酒次数符合要求且最后一次是喝酒操作才算是一个正确的解
		if (drink == 0 && add == 0 && sub == 0 && n[14] == 0) {
			sum++;
			/*for (int i = 0; i < n.length; i++) {
				if (n[i] == 1) {
					System.out.print("a");
				} else {
					System.out.print("b");
				}
			}
			System.out.println();*/
			return;
		}
		if (current >= 15) {
			return;
		}
		//喝酒次数大于0且酒壶还有酒时才能喝酒
		if (sub>0 && drink>0) {
			n[current] = 0;
			f(drink - 1, add, sub - 1, current + 1);
			n[current] = 0;	//回溯
		}
		//买酒次数大于0才能买酒
		if (add>0) {
			n[current] = 1;
			f(drink * 2, add - 1, sub, current + 1);
			n[current] = 0;	
		}
	}

}
